package com.edu.exam.entity.examination.control;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

/**
 * 安全事件详情实体类
 * 所属模块：E-01 考试执行模块
 * 对应数据库表：security_event_detail
 *
 * <p>安全事件详情实体用于记录安全事件的详细信息，包括事件详情、
 * 证据信息、相关数据、处理日志等。支持事件详情的完整记录和管理。</p>
 *
 * <p>核心功能：
 * - 事件详情记录：完整记录事件的详细信息
 * - 证据管理：存储和管理事件相关证据
 * - 数据分析：支持事件数据的深入分析
 * - 处理日志：记录事件处理的详细过程
 * - 历史追踪：支持事件处理的完整历史追踪</p>
 *
 * @author System
 * @version 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Accessors(chain = true)
public class SecurityEventDetail {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 详情ID
     *
     * <p>安全事件详情的唯一标识符，采用UUID格式生成。</p>
     */
    @Column(name = "detail_id", nullable = false, length = 32, unique = true)
    private String detailId;

    /**
     * 事件ID
     *
     * <p>关联的安全事件ID。</p>
     */
    @Column(name = "event_id", nullable = false, length = 32)
    private String eventId;

    /**
     * 详情类型
     *
     * <p>事件详情的类型。
     * 支持的类型：EVIDENCE（证据）、ANALYSIS（分析）、PROCESSING（处理）、HISTORY（历史）等</p>
     */
    @Column(name = "detail_type", nullable = false, length = 50)
    private String detailType; // TODO: 迁移到外部枚举 DetailType

    /**
     * 详情标题
     *
     * <p>事件详情的标题。</p>
     */
    @Column(name = "detail_title", nullable = false, length = 200)
    private String detailTitle;

    /**
     * 详情内容
     *
     * <p>事件详情的详细内容。</p>
     */
    @Column(name = "detail_content", columnDefinition = "TEXT")
    private String detailContent;

    /**
     * 证据类型
     *
     * <p>证据的类型。
     * 支持的类型：SCREENSHOT（截图）、VIDEO（视频）、LOG（日志）、NETWORK（网络数据）、SYSTEM（系统数据）等</p>
     */
    @Column(name = "evidence_type", length = 50)
    private String evidenceType; // TODO: 迁移到外部枚举 EvidenceType

    /**
     * 证据文件路径
     *
     * <p>证据文件的存储路径。</p>
     */
    @Column(name = "evidence_file_path", length = 500)
    private String evidenceFilePath;

    /**
     * 证据数据
     *
     * <p>JSON格式的证据数据。</p>
     */
    @Column(name = "evidence_data", columnDefinition = "TEXT")
    private String evidenceData;

    /**
     * 数据来源
     *
     * <p>详情数据的来源。</p>
     */
    @Column(name = "data_source", length = 100)
    private String dataSource;

    /**
     * 数据格式
     *
     * <p>详情数据的格式。</p>
     */
    @Column(name = "data_format", length = 50)
    private String dataFormat;

    /**
     * 严重程度
     *
     * <p>详情内容的严重程度。</p>
     */
    @Column(name = "severity_level", length = 20)
    private String severityLevel; // TODO: 迁移到外部枚举 SeverityLevel

    /**
     * 可信度
     *
     * <p>详情内容的可信度，范围0-1。</p>
     */
    @Column(name = "confidence_level", precision = 3, scale = 2)
    private Float confidenceLevel = 0.0f;

    /**
     * 详情标签
     *
     * <p>JSON格式的详情标签。</p>
     */
    @Column(name = "detail_tags", columnDefinition = "TEXT")
    private String detailTags;

    /**
     * 详情状态
     *
     * <p>详情的处理状态。
     * 支持的状态：ACTIVE（有效）、ARCHIVED（已归档）、DELETED（已删除）</p>
     */
    @Column(name = "detail_status", nullable = false, length = 20)
    private String detailStatus = "ACTIVE"; // TODO: 迁移到外部枚举 DetailStatus

    /**
     * 处理者ID
     *
     * <p>处理详情的操作者ID。</p>
     */
    @Column(name = "processor_id", length = 32)
    private String processorId;

    /**
     * 处理时间
     *
     * <p>详情被处理的时间。</p>
     */
    @Column(name = "processing_time")
    private LocalDateTime processingTime;

    /**
     * 详情备注
     *
     * <p>详情的备注信息。</p>
     */
    @Column(name = "detail_notes", columnDefinition = "TEXT")
    private String detailNotes;

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    /**
     * 版本号
     */
    @Version
    @Column(name = "version", nullable = false)
    private Long version = 0L;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;
}